package com.example.community.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//@Component
//@Aspect
public class AlphaAspect {

    // 描述哪些方法是要处理的目标
    // 第一个*表示所有返回值、第二个*表示所有service包下的所有类、第二个*表示所有方法， ..表示所有参数
    // 即匹配所有service组件中的所有方法，所有参数所有返回值
    @Pointcut("execution(* com.example.community.service.*.*(..))")
    public void pointcut() {

    }

    // Advice

    // 在连接点开头织入
    @Before("pointcut()")
    public void before() {
        System.out.println("before");
    }

    // 在连接点结束
    @After("pointcut()")
    public void after() {
        System.out.println("after");
    }

    // 在返回值以后
    @AfterReturning("pointcut()")
    public void afterRetuning() {
        System.out.println("afterRetuning");
    }

    // 在抛异常时
    @AfterThrowing("pointcut()")
    public void afterThrowing() {
        System.out.println("afterThrowing");
    }

    // 在连接点前后都织入
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("around before");
        Object obj = joinPoint.proceed();   // 调用目标组件的方法
        System.out.println("around after");
        return obj;
    }

}
